﻿using GDM.Hogar.Aplicacion.Properties;
using GDM.Hogar.Entidades;
using GDM.Hogar.Entidades.Enums;
using GDM.Hogar.Managers.Contratos;
using GDM.Hogar.Soporte.Helpers;
using System;
using System.Linq;
using System.Windows.Forms;

namespace GDM.Hogar.Aplicacion.Formularios.Integrantes
{
    public partial class FrmConsultaIntegrantes
#if DEBUG
 : FrmConsultaIntegrante
#else
        : FrmConsulta<ConsultaIntegrante>
#endif
    {
        private readonly IIntegranteManager _integranteManager;
        private readonly IObraSocialManager _obraSocialManager;
        private readonly IActividadManager _actividadManager;

        private FrmIntegrante _frmCrearIntegrante;
        private FrmIntegrante _frmEditarIntegrante;
        private FrmBajaIntegrante _frmBajaIntegrante;

        private bool EsProfesional
        {
            get { return ContextoUsuario.RolId == (int)Rol.Profesional; }
        }

        #region Public Methods

        public FrmConsultaIntegrantes(IIntegranteManager integranteManager, IObraSocialManager obraSocialManager, IActividadManager actividadManager)
        {
            if (integranteManager == null)
                throw new ArgumentNullException("integranteManager");
            if (obraSocialManager == null)
                throw new ArgumentNullException("obraSocialManager");
            if (actividadManager == null)
                throw new ArgumentNullException("actividadManager");

            _integranteManager = integranteManager;
            _obraSocialManager = obraSocialManager;
            _actividadManager = actividadManager;

            InitializeComponent();
        }

        #endregion Public Methods

        #region Private Methods

        protected override void CrearRegistro()
        {
            _frmCrearIntegrante = AbrirFormularioModal(_frmCrearIntegrante, action: frm => frm.OnIntegranteCreado = RefrescarGrilla);
        }

        protected override void EditarRegistro(ConsultaIntegrante integrante)
        {
            _frmEditarIntegrante = AbrirFormularioModal(_frmEditarIntegrante, action:
                frm =>
                {
                    frm.OnIntegranteActualizado = RefrescarGrilla;
                    frm.Integrante = integrante;
                });
        }

        protected override void EliminarRegistro(ConsultaIntegrante integrante)
        {
            try
            {
                var delFrmCerrado = new FormClosedEventHandler(BajaIntegranteFormClosed);
                _frmBajaIntegrante = AbrirFormularioModal(_frmBajaIntegrante, delFrmCerrado, f => f.IntegranteId = integrante.IntegranteId);
            }
            catch (Exception ex)
            {
                MostrarMensajeError(Resources.EliminarIntegrante_Error);
            }
        }

        private void BajaIntegranteFormClosed(object sender, FormClosedEventArgs e)
        {
            var frm = sender as FrmBajaIntegrante;
            if (frm != null)
            {
                if (frm.RefrescarCambios)
                {
                    var integrante = Datos.First(a => a.IntegranteId == frm.IntegranteId);
                    integrante.Activo = false;
                    integrante.ObservacionBaja = frm.MotivoBaja;
                    integrante.FechaBaja = DateTime.Today;
                    btnBuscar_Click(null, null);
                }
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            dgIntegrantes.Search(Datos.AsQueryable(), CriterioDeBusqueda);
        }

        private void btnQuitarFiltro_Click(object sender, EventArgs e)
        {
            LimpiarControl(gbFiltros);
            btnBuscar_Click(null, null);
        }

        private void CargarIntegrantes()
        {
            Datos = _integranteManager.ObtenerIntegrantes();
            InicializarGrilla(dgIntegrantes, a => a.Activo && a.FechaInscripcion.Year == DateTime.Now.Year);
            ckbActivos.Visible = Datos.Any();
        }

        private void CargarTalleres()
        {
            cmbTalleres.CargarItems(_actividadManager.ObtenerTalleres(), "Nombre", "ActividadId", true);
        }

        private void CargarObrasSociales()
        {
            cmbObrasSociales.CargarItems(_obraSocialManager.ObtenerObrasSociales(), "Descripcion", "ObraSocialId", true);
        }

        private void ckbActivos_CheckedChanged(object sender, EventArgs e)
        {
            dgIntegrantes.UserCanDelete = ckbActivos.Checked && EsProfesional;
            dgIntegrantes.ReadOnlyMode = !ckbActivos.Checked || ContextoUsuario.RolId == (int)Rol.Responsable ||
                                         ContextoUsuario.RolId == (int)Rol.Administrativo;
            btnBuscar_Click(null, null);
        }

        private bool CriterioDeBusqueda(ConsultaIntegrante integrante)
        {
            //var criterio = integrante.Activo == ckbActivos.Checked;
            bool criterio;
            if (ckbActivos.Checked)
            {
                criterio = integrante.Activo && integrante.FechaInscripcion.Year == DateTime.Now.Year;
            }
            else
            {
                criterio = !integrante.Activo;
            }
            if (!txtDni.Text.EsVacio()) criterio = criterio && integrante.Dni.Contiene(txtDni.Text);
            if (!txtNombre.Text.EsVacio()) criterio = criterio && integrante.NombreCompleto.ToLower().Contiene(txtNombre.Text.ToLower());
            if (!txtApellido.Text.EsVacio()) criterio = criterio && integrante.NombreCompleto.ToLower().Contiene(txtApellido.Text.ToLower());
            if (cmbObrasSociales.SelectedIndex > 0)
                criterio = criterio && integrante.ObraSocial == ((ObraSocial)cmbObrasSociales.SelectedItem).Descripcion;
            if (cmbTalleres.SelectedIndex > 0)
                criterio = criterio && integrante.TalleresIds.Contains(((Actividad)cmbTalleres.SelectedItem).ActividadId);
            if (ckbComedor.Checked)
                criterio = criterio && integrante.AsisteComedor;
            if (ckbVianda.Checked)
                criterio = criterio && integrante.AsisteVianda;
            return criterio;
        }

        private void FrmConsultaIntegrantes_Load(object sender, EventArgs e)
        {
            CargarObrasSociales();
            CargarTalleres();
            dgIntegrantes.UserCanDelete = EsProfesional;
            dgIntegrantes.UserCanAdd = EsProfesional;
            dgIntegrantes.ReadOnlyMode = ContextoUsuario.RolId == (int)Rol.Responsable || ContextoUsuario.RolId == (int)Rol.Administrativo;
            CargarIntegrantes();
            ttInfo.SetToolTip(btnQuitarFiltro, "Quitar filtro");
        }

        private void RefrescarGrilla()
        {
            Datos = _integranteManager.ObtenerIntegrantes();
            btnBuscar_Click(null, null);
        }

        #endregion Private Methods
    }
}